<?php

/*
	Classe abstraite xObject.
	par Pierre-Eric OUDIN
	Cette classe est abstraite est est basée sur l'implémentation de classes qui prennent naissances avec les objets que represent 
	les tables sont la base de ces objets, une classe étendue de oxObject s'identifie à une table, une ligne = une instance de la classe
	
*/

abstract class xObject 
{
	protected $sql_link ;	//Lien SQL utilisé
	protected  $table_name ; //Nom de la table qui servira de base pour l'instanciation des objets
	protected  $db_name;
	var $fieldList ;
	protected $semaphore;
	protected $pkey;
	var $writeAttrRef;
	
	public function __construct(&$prmSQL, $prmTblName, $dbName = false, $defaultpKey = "id", $auto_init = true) 
	{	
		$this->pkey =$defaultpKey;
		$this->writeAttrRef = NULL;
		$this->sql_link = $prmSQL;
		$this->table_name = $prmTblName ;
		//initialise les attributs de la classe
		//echo "<br>lien sql:"; print_r($this->sql_link) ;
		if($dbName)
		{
			$this->db_name = $dbName;
			$this->sql_link->select_db($this->db_name);
		}
		//print_r($this->sql_link) ;
		if ($auto_init) 
			$this->init() ;				
	}
	
	//---  Initialise les attributs de la classe (1 attribut = 1 champ de la table --- /
	//=> A implémenter: prise des valeurs par défaut de chaque champ de la table
	public function init()
	{	
		$query1 = "SHOW COLUMNS FROM `".$this->table_name."`";
		//echo $query1;
		$r = $this->sql_link->query($query1, true) ;
		$i = 0;
		
		while($tmp = $r->fetch_array()) 
		{		
			eval("\$this->".$tmp['Field']." = \"\" ;") ;	
			$this->fieldList[$i] = $tmp['Field'] ;
			$this->lock_attribute($tmp['Field'],0) ;
			$i++ ;
		}
	}
	
	function getStructure()
	{
		return $this->fieldList ;
	}
	
	//--- bool GetbyId(int $prmId) : instancie l'objet et remplis les attributs avec les valeurs des champs correspondant à la ligne d'id $prmId
	public function getByKey($prmId, $pKey = false)
	{
		
		if($pKey) $keyField = $pKey;
		else $keyField = $this->pkey;
		$q= "SELECT SQL_CACHE * FROM ".$this->table_name." WHERE ".$keyField." = '".$prmId."'";
		//echo $q;
		if ($r = $this->sql_link->query($q, true)) 
		{
			$tmp = $r->fetch_array() ; //on récupere les valeurs indexées par le nom du champ		
			
			if (is_array($tmp)) 
			{
				foreach($tmp as $field_name => $field_value) 
				{
					
					$field_value = str_replace("\"","\\\"",$field_value) ;
									
					//eval("\$this->$field_name = \"$field_value\";") ;
					$this->$field_name = $field_value;
					
				}
				$pkeyName = $this->pkey;
				$this->writeAttrRef = $this->$pkeyName;
				
				return true ;
			}
			return false ;
		}
		return false ;
	
	}
	
	//verrouille ou déverrouille le sémaphore associé a l'attribut
	public function lock_attribute($prmField) 
	{
		$this->semaphore[$prmField] = 1 ;
	}
	public function unlock_attribute($prmField) 
	{
		$this->semaphore[$prmField] = 0 ;
	}
	
	//verrouille ou déverrouille tous les sémaphores
	public function lock($prmStatus = 1) 
	{
		$tmp = NULL ;
		
		foreach($this->semaphore as $field => $status) {
			$tmp[$field] = $prmStatus ;
		}
		
		$this->semaphore = $tmp ;
	}
	
	//alias de lock(0)
	public function unlock()
	{
		$this->lock(0) ;
	}
	
	//efface l'enregistrement de la base
	public function delete() 
	{
		$q = "DELETE FROM ".$this->table_name." WHERE ".$this->pkey." = '".$this->writeAttrRef."'";
		echo $q;
		if($this->sql_link->query($q)) return true ;
		else return false ;
	}
	
	//crée un nouvel enregistrement dans la base ATtention il faut s'assurer d'avori mis un champ AutoIncrement ..
	public function create() 
	{
			$q = "INSERT INTO ".$this->table_name." (".$this->pkey.") VALUES ('')";
		if ($this->sql_link->query($q)) 
		{
			$query = "SELECT SQL_CACHE MAX(".$this->pkey.") AS max_idval FROM ".$this->table_name." ";
			//on recupère le dernier ID
			$r = $this->sql_link->query($query) ;
			$data = $r->fetch_object() ;
			$this->writeAttrRef = $data->max_idval ;
			$this->id = $data->max_idval  ;
			
			return true ;
		}
		else return false ;	
		
	}
	
	function setPKey($key)
	{
		$this->pkey=$key;
	}
	
	function updatePHPObject()
	{
		getByKey($this->id, $pKey = false);
	}
	function setWriteAttribute($writeAttr)
	{
		$this->writeAttrRef = $writeAttr;
	}
	//Enregistre les informations de l'objet dans la table
	public function write()
	{
		if($this->writeAttrRef == NULL ) $this->writeAttrRef = $this->id ;
		
		$query = NULL ;
		for($i =0 ; $i < sizeof($this->fieldList) ; $i++)
		{
			$field = $this->fieldList[$i] ;
			if($this->semaphore[$field] == 0 ) //1 = verrouillé - 0 = deverrouillé
			{
				eval("\$query[] = \"`\".\$field.\"` = \\\"\".str_replace(\"\\\"\",\"\\\\\\\"\",\$this->$field).\"\\\"\" ;") ;
		
			}
			//$query[] = $field." = " .$this->$field ;
		}
		
		$query = implode(",",$query) ;
		//print_r($query);
		$oxQuery = "UPDATE ".$this->table_name." SET ".$query." WHERE `".$this->pkey."` = '".$this->writeAttrRef."'";
		//echo "<br>".$oxQuery;
		if($this->sql_link->query($oxQuery))  return true ;
		else		return false ;
	}
	
	
}




?>